// axiosInstance.js
import axios from 'axios';
import axiosRetry from 'axios-retry';

// 获取环境变量
const isDevelopment = import.meta.env.MODE === 'development'; // 判断是否为开发环境

// 动态设置 baseURL
const baseURL = isDevelopment
  ? '/dev' // 开发环境使用代理路径
  : 'https://haokan.chaihongjun.me/reverseproxy'; // 生产环境 因为需要再次Reverse Proxy 所以 nginx 反向代理 reverseproxy

// 创建 Axios 实例
const axiosInstance = axios.create({
  baseURL,
  timeout: 5000, // 超时时间（毫秒）
  headers: {
    'Content-Type': 'application/json',
  },
});

// 配置自动重试机制
axiosRetry(axiosInstance, {
  retries: 3, // 最多重试次数
  retryDelay: (retryCount) => (retryCount + 1) * 2000, // 延迟 2s/4s/6s
  shouldResetTimeout: true, //axios每次请求可以用的时间 都是timeout
  retryCondition: (error) => {
    // 1. 超时或网络断开
    if (error.code === 'ECONNABORTED' || !error.response) return true;
    // 2. 仅重试服务器错误 (5xx)
    return error.response.status >= 500;
  }
});

// 请求拦截器
axiosInstance.interceptors.request.use(
  (config) => {
    // console.log(`[${isDevelopment ? '开发环境' : '生产环境'}] 请求地址: ${config.url}`);
    return config;
  },
  (error) => {
    console.error('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
  (response) => {
    // console.log('响应:', response);
    return response.data; // 返回响应数据
  },
  (error) => {
    console.error('响应拦截器错误:', error);
    if (error.response) {
      // 根据 HTTP 状态码处理错误
      switch (error.response.status) {
        case 404:
          console.error('资源未找到');
          break;
        case 400:
          console.error('客户端请求错误');
          break;
        case 401:
          console.error('未授权，请检查认证信息');
          break;
        case 403:
          console.error('禁止访问，权限不足');
          break;
        case 500:
          console.error('服务器内部错误');
          break;
        default:
          console.error('其他错误:', error.response.status);
      }
    } else if (error.request) {
      console.error('请求未收到响应');
    } else {
      console.error('请求设置错误:', error.message);
    }
    return Promise.reject(error);
  }
);

export default axiosInstance;
